package haierhome.krund.cn.daggertworetrofitrxjavamvp.rxjava.rxretrofiteasefram.retrofit;

import android.content.Context;
import android.util.Log;

import java.util.concurrent.TimeUnit;

import haierhome.krund.cn.daggertworetrofitrxjavamvp.retrofit.net.NetConfig;
import haierhome.krund.cn.daggertworetrofitrxjavamvp.rxjava.rxretrofiteasefram.exception.ExceptionHandle;
import haierhome.krund.cn.daggertworetrofitrxjavamvp.rxjava.rxretrofiteasefram.subscrib.MySubscriber;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * Retrofit 请求工具类  lps
 */

public class RxJavaRetorfitUtils<T> {

    private static RxJavaRetorfitUtils retorfitUtils;
    private static RetrofitApi retrofitApi;


    private RxJavaRetorfitUtils() {

    }

    /**
     * 全局Retrofit单例
     *
     * @return
     */
    public static RxJavaRetorfitUtils getInstance() {
        if (retorfitUtils == null) {
            retorfitUtils = new RxJavaRetorfitUtils();
        }
        return retorfitUtils;
    }

    /**
     * 初始化retrofitApi
     *
     * @return
     */
    public RetrofitApi initRxJavaRetorfitUtils() {

        OkHttpClient client = new OkHttpClient.Builder().
                connectTimeout(5, TimeUnit.SECONDS)
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(NetConfig.BASE_PAHT)
                .client(client)
                //.addConverterFactory(FastJsonConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())

                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        retrofitApi = retrofit.create(RetrofitApi.class);
        return retrofitApi;

    }

    /**
     * 通过该HttpRequest得到数据
     *
     * @param observable       通过初始化的RetrofitApi 调用不同的请求方法获得Observable对象
     * @param retrofitCallBack 通过回调接口返回数据
     */
    public void httpRequest(Context context,Observable<T> observable, final RetrofitCallBack<T> retrofitCallBack) {
        //调度线程
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())

//                这么处理异常都抓不到坑啊
//                .subscribe(new Action1<T>() {
//                    @Override
//                    public void call(T t) {
//                        //可以在里面进行操作
//                        if(null==t){
//                            retrofitCallBack.onError();
//                        }else{
//                            retrofitCallBack.onSuccess(t);
//                        }
//                    }
//                });
                //这样也有问题 // 所以自定义subscrib
//                .subscribe(new Subscriber<T>() {
//                    @Override
//                    public void onCompleted() {
//
//                    }
//
//                    @Override
//                    public void onError(Throwable e) {
//
//                    }
//
//                    @Override
//                    public void onNext(T t) {
//                        //可以在里面进行操作
//                        if (null == t) {
//                            retrofitCallBack.onError();
//                        } else {
//                            retrofitCallBack.onSuccess(t);
//                        }
//                    }
//                });
                //这种改进方式
                .subscribe(new MySubscriber<T>(context) {

                    @Override
                    public void onNext(T t) {

                        Log.i("@@", "收到数据 =" + t.toString());

                        if (retrofitCallBack == null) return;

                        if (null == t) {
                            retrofitCallBack.onError(ExceptionHandle.ERROR.UNKNOWN,"未知错误");
                        } else {
                            retrofitCallBack.onSuccess(t);
                        }

                    }

                    @Override
                    public void onError(ExceptionHandle.ResponeThrowable responeThrowable) {
                        Log.e("@@", "请求失败！");
                        Log.e("@@", "responeThrowable.code=" + responeThrowable.code);
                        Log.e("@@", "responeThrowable.message=" + responeThrowable.message);

                        if (retrofitCallBack == null) return;
                        retrofitCallBack.onError(responeThrowable.code,responeThrowable.message);
                        
                    }
                });
    }

    public interface RetrofitCallBack<T> {
        void onSuccess(T t);

        void onError(int code,String msg);
    }
}
